package day4_thread_safe.phenomenon;

/**
 * 线程不安全的现象
 */
public class Demo {

    // 定义一个被操作的数
    static int r = 0;
    // 定义操作的数
    static final int COUNT = 100_0000;

    static class Add extends Thread {
        @Override
        public void run() {
            for (int i = 0; i < COUNT; i++) {
                r ++;
            }
        }
    }

    static class Sub extends Thread {
        @Override
        public void run() {
            for (int i = 0; i < COUNT; i++) {
                r --;
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Thread add = new Add();
        add.start();
        Thread sub = new Sub();
        sub.start();

        // 等待结束
        add.join();
        sub.join();

        // 理论上还是0, 但是实际现象是吗？
        System.out.println(r);
        // 实际运行结果，并不是100%正确；反而随着COUNT的增大，出错概率也增大
        // 为什么COUNT越大，出错的概率越大?
        //  COUNT越大，线程执行需要跨时间片的概率越大，碰到线程调度的概率越大，导致出错的概率越大。
    }
}
